#include"../inc/Accept.h"

namespace http_server
{
    Accept::Accept(const size_t port)
    : _addr(port), _sock()
    {}

    Accept::Accept(const string& ip, const size_t port)
    : _addr(ip, port), _sock()
    {}

    Accept::Accept(const sockaddr_in& addr)
    : _addr(addr), _sock()
    {}

    int Accept::getCfd()
    {
        sockaddr_in cli_addr = {0};
        socklen_t len = sizeof(cli_addr);
    
        int ret =  ::accept(_sock.getFd(), (sockaddr*)&cli_addr, &len);
        if(-1 == ret)
            perror("accept err");
    
        return ret;
    }   

    int Accept::getFd()
    {
        return _sock.getFd();
    }

    void Accept::reuseAddr(bool flag)
    {
        int fflag = flag;
        int ret = ::setsockopt(_sock.getFd(), 
        SOL_SOCKET, 
        SO_REUSEADDR, 
        &fflag, sizeof(fflag));
        if(-1 == ret)
            perror("setsockopt ADDR");
    }

    void Accept::reusePort(bool flag)
    {
        int fflag = flag;
        int ret = ::setsockopt(_sock.getFd(), 
        SOL_SOCKET, 
        SO_REUSEPORT, 
        &fflag, sizeof(fflag));
        if(-1 == ret)
            perror("sersockopt PORT");
    }

    void Accept::Bind()
    {
        int ret = ::bind(_sock.getFd(), 
        (sockaddr*)_addr.getInetAddr(), 
        sizeof(sockaddr));
        if(-1 == ret)
            perror("bind err");
    }

    void Accept::Listen(int size)
    {
        int ret = ::listen(_sock.getFd(), size);
        if(-1 == ret)
            perror("listen err");
    }

    void Accept::Start()
    {
        reuseAddr(true);
        reusePort(true);
        Bind();
        Listen(128);
    }
}